解決 .NET Docker 容器中缺少字型檔的問題
TLDR
- .NET 官方 Docker 映像檔(如 Debian)為精簡版,預設不包含字型套件,導致容器內缺少
/usr/share/fonts目錄。 - 解決方案為在 Dockerfile 中安裝
ttf-mscorefonts-installer與fontconfig套件,並執行fc-cache重新整理字型快取。 - Debian 11 (.NET 6) 與 Debian 12 (.NET 8) 的套件庫設定檔路徑不同,需依版本調整
sed指令。 - Debian 11 使用
/etc/apt/sources.list;Debian 12 使用/etc/apt/sources.list.d/debian.sources。
Docker 容器中的字型問題
什麼情況下會遇到這個問題:當應用程式需要進行圖形渲染、PDF 生成或處理文件,且基礎映像檔為 mcr.microsoft.com/dotnet/aspnet 等精簡版 Linux 映像檔時,會發現系統缺少字型支援。
在 Linux 系統中,字型通常存放於 /usr/share/fonts。由於官方 .NET 映像檔為了縮減體積,未預裝常見字型套件,導致該目錄可能不存在或為空。
針對 .NET 6 (Debian 11) 的解決方案
在 Debian 11 環境下,需修改 /etc/apt/sources.list 以啟用 contrib 儲存庫,並安裝必要套件:
dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
# 啟用 contrib 儲存庫
RUN sed -i'.bak' 's/$/ contrib/' /etc/apt/sources.list
# 安裝字型安裝器與 fontconfig
RUN apt-get update; apt-get install -y ttf-mscorefonts-installer fontconfig
# 強制重新整理字型快取
RUN fc-cache -f -v處理 .NET 8 Dockerfile 的問題
什麼情況下會遇到這個問題:當升級至 .NET 8 映像檔(基於 Debian 12)時,直接沿用舊版的 sed 指令會失敗,並出現 exit code: 21 錯誤。
原因在於 Debian 12 移除了 /etc/apt/sources.list,改用 /etc/apt/sources.list.d/debian.sources 進行套件管理。
針對 .NET 8 (Debian 12) 的解決方案
針對 Debian 12 的結構,需調整 sed 的目標檔案與匹配規則:
dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
# 在 debian.sources 中啟用 contrib
RUN sed -i 's/^Components: main$/& contrib/' /etc/apt/sources.list.d/debian.sources
# 安裝字型安裝器與 fontconfig
RUN apt-get update; apt-get install -y ttf-mscorefonts-installer fontconfig
# 強制重新整理字型快取
RUN fc-cache -f -vTIP
安裝完成後,可透過檢查 /usr/share/fonts/truetype 目錄是否存在來驗證字型是否已成功安裝。
異動歷程
- 2024-08-09 初版文件建立。
